package Day_0209.NetWork;

/**
 * @author zxc
 * @date 2023/02/09 22:00
 **/
public class TCP_Sticky_Package {
    public static void main(String[] args) {
        /**
         * TCP粘包问题产生原因 && 如何解决TCP粘包问题
         * ===》
         * 1.TCP粘包问题产生原因
         * （1）TCP 传输数据基于字节流，从应用层到 TCP 传输层的多个数据包是一连串的字节流是没有边界的，
         *  而且 TCP 首部并没有记录数据包的长度，所以 TCP 传输数据的时候可能会发送粘包和拆包的问题;
         *  ===》 即，TCP传输数据基于字节流 && TCP首部并未记录数据包长度,从而导致TCP粘包问题的产生;
         *
         * （2）UDP 是基于数据报传输数据的，UDP 首部也记录了数据报的长度，可以轻易地区分出不同的数据包的边界。
         *
         *
         * 2.造成粘包和拆包现象的原因：
         * （1）TCP 发送缓冲区剩余空间不足以发送一个完整的数据包，将发生拆包；
         * （2）要发送的数据超过了最大报文长度的限制，TCP 传输数据时进行拆包；
         * （3）要发送的数据包小于 TCP 发送缓冲区剩余空间，TCP 将多个数据包写满 发送缓冲区 一次发送出去，将发生粘包；
         * （4）接收端没有及时读取 TCP 发送缓冲区中的数据包，将会发生粘包。
         *
         *
         * 3.粘包拆包的解决方法：
         * （1）发送端给数据包添加首部，首部中添加数据包的长度属性，这样接收端通过首部中的长度字段就可以知道数据包的实际长度;
         * （2）针对发送数据包小于缓冲区大小的情况，发送端可以将不同的数据包规定成同样的长度，不足这个长度的补充 0，
         *  接收端从缓冲区读取固定的长度数据，这样就可以区分不同的数据包;
         * （3）发送端通过给不同的数据包添加间隔符合 确定边界，接收端通过这个间隔符合，就可以区分不同的数据包;
         *
         */
    }
}
